package cn.lingyangwl.agile.infra;

import cn.lingyangwl.agile.infra.common.ScanScene;
import cn.lingyangwl.agile.infra.module.datamanage.db.*;
import cn.lingyangwl.agile.infra.module.file.model.rqrs.FileRecordResp;
import cn.lingyangwl.agile.infra.module.file.model.rqrs.MediaMaterialResp;
import cn.lingyangwl.agile.infra.module.group.model.rqrs.*;
import cn.lingyangwl.agile.infra.module.group.model.rqrs.DataGroupDto;
import cn.lingyangwl.agile.infra.module.misc.*;
import cn.lingyangwl.agile.model.constants.ServiceCodeCons;
import cn.lingyangwl.framework.core.response.Resp;
import com.alibaba.cloud.nacos.NacosServiceAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author shenguangyang
 */
@Lazy
@FeignClient(contextId = "DataGroupFeign", value = ServiceCodeCons.INFRA_SERVICE)
@ConditionalOnClass({FeignAutoConfiguration.class, NacosServiceAutoConfiguration.class})
public interface InfraRemote {
    @GetMapping("/material/get")
    Resp<MediaMaterialResp> getMediaMaterial(@RequestParam("id") Long id);

    /**
     * 保存 通用数据组
     *
     * @param req 新增的记录
     * @return 是否保存成功
     */
    @PostMapping("/dataGroup/save")
    Resp<Long> saveDataGroup(@RequestBody DataGroupSaveReq req);

    /**
     * 更新 通用数据组
     *
     * @param req 修改的记录
     * @return 是否更新成功
     */
    @PostMapping("/dataGroup/update")
    Resp<Boolean> updateDataGroup(@RequestBody DataGroupUpdateReq req);

    /**
     * 获取 通用数据组
     *
     * @param id 主键
     * @return 是否删除成功
     */
    @GetMapping("/dataGroup/get")
    Resp<DataGroupDto> getDataGroup(@RequestParam("id") Long id);

    /**
     * 删除 通用数据组
     *
     * @param id 主键
     * @return 是否删除成功
     */
    @DeleteMapping("/dataGroup/delete")
    Resp<Boolean> deleteDataGroup(@RequestParam("type") Integer type, @RequestParam("id") Long id);

    /**
     * 批量删除 通用数据组
     *
     * @param ids 主键集合
     * @return 是否删除成功
     */
    @DeleteMapping("/dataGroup/batchDelete")
    Resp<Boolean> batchDeleteDataGroup(@RequestParam("bizType") Integer bizType, @RequestParam("ids") List<Long> ids);

    /**
     * 获取数据组某个节点下的子节点
     * @param parentId 父节点
     * @return 传进的父节点的所有子节点
     */
    @PostMapping("/dataGroup/listChildren")
    Resp<List<DataGroupDto>> listChildrenDataGroup(@RequestParam(value = "parentId") Long parentId);

    /**
     * 查询数据组
     */
    @GetMapping("/dataGroup/list")
    Resp<List<DataGroupDto>> listDataGroup(@SpringQueryMap DataGroupQuery req);

    /**
     * 获取内网url
     */
    @GetMapping(value = "/file/getIntranetUrl")
    Resp<String> getFileIntranetUrl();

    /**
     * 通过文件上传路径查询查找 文件上传记录
     */
    @GetMapping(value = "/getFileRecordByPath")
    Resp<FileRecordResp> getFileRecordByPath(@RequestParam(value = "path") String path,
                                         @RequestParam(value = "isIntranet") Boolean isIntranet);

    @DeleteMapping(value = "/deleteFileRecordByPath")
    Resp<?> deleteFileRecordByPath(@RequestParam(value = "path") String path);


    /**
     * 获取当前配置的公众号账号二维码
     */
    @PostMapping(value = "/mpQrcode/getQrcode")
    Resp<String> getMpQrcode(@RequestBody ScanScene req);


    /**
     * 获取id生成器的下一个workId
     * @return -1或者为空则生成失败
     */
    @GetMapping(value = "/idGen/getNextWork")
    Resp<Short> getIdGenNextWorkId();

    /**
     * 刷新id生成器workId被占用时间
     * @param workId 当前服务所被分配的workId值
     */
    @PostMapping(value = "/idGen/refreshWorkId")
    Resp<Boolean> refreshIdGenWorkId(@RequestParam("workId") Short workId);

    /**
     * 通过指定的数据源获取数据库表
     */
    @GetMapping(value = "/dataSource/listSqlContext")
    Resp<List<SQLContext>> listSqlContext(@RequestParam("datasourceId") Long datasourceId,
                                          @RequestParam("tableNames") List<String> tableNames);

    /**
     * ip 转 区域信息
     */
    @GetMapping(value = "/common/ip2Region")
    Resp<Ip2RegionDto> ip2Region(@RequestParam("ip") String ip);
}
